"""
给定精确度 flex,用二分法求函数 f(x) 零点近似值的步骤如下：
    确定区间 [a,b]，验证 f(a)*f(b)<0,给定精确度 flex
    求区间 (a,b) 的中点 c
    计算 f(c):
        如果 f(c)=0，则 c 就是函数的零点
        如果 f(a)*f(c)<0，则令 b=c
        如果 f(c)*f(b)<0，则令 a=c
        判断是否达到精确度 flex，即若 |a-b|< flex，
        则得到零点近似值 a(或 b),否则重复 2-3 步骤
    例子：请在[1,1000]区间内，找到 x^3-2*x-5 的零点
"""


def zero_point(function, area, flex):
    a = area[0]
    b = area[1]
    if function(a) == 0:
        return a
    if function(b) == 0:
        return b
    if function(a) * function(b) > 0:
        return None
    mid = (a + b) / 2
    while abs(a - b) > flex:
        if function(mid) == 0:
            return mid
        if function(a) * function(mid) < 0:
            b = mid
        else:
            a = mid
        mid = (a + b) / 2
    return mid


def f(x):
    return x**3 - 2 * x - 5


print(zero_point(f, [1, 1000], 10e-7))
